/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.ec.socialfun.servicios;

import com.ec.socialfun.entidades.Local;
import com.ec.socialfun.entidades.Usuario;
import com.ec.socialfun.enumeradores.EstadoEnum;
import com.ec.socialfun.enumeradores.MostrarFotosEnum;
import com.ec.socialfun.excepciones.ActivarUsuarioException;
import com.ec.socialfun.excepciones.AdministracionLocalException;
import com.ec.socialfun.excepciones.CreacionSucursalException;
import com.ec.socialfun.excepciones.CrearLocalesImagenException;
import com.ec.socialfun.excepciones.RegistroLocalException;
import com.ec.socialfun.util.IngresoLocal;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import org.jboss.logging.Logger;

/**
 *
 * @author hp
 */
@Stateless
public class LocalesFacade extends AbstractFacade<Local> {

    private static final Logger LOG = Logger.getLogger(LocalesFacade.class.getName());
    @PersistenceContext(unitName = "SocialFunPU")
    private EntityManager em;
    @EJB
    private UsuarioFacade usuarioFacade;
    @EJB
    private SucursalFacade sucursalFacade;
    @EJB
    private LocalesImagenFacade localesImagenFacade;

    @Override
    protected EntityManager getEntityManager() {
        return em;
    }

    public LocalesFacade() {
        super(Local.class);
    }

    /**
     * registra un nuevo local y el usuario respectivo, ademas crea la carpeta
     * para el almacenamiento de las imagenes del local
     *
     * @param ingresoLocal
     */
    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public void registrarLocal(IngresoLocal ingresoLocal) throws RegistroLocalException {
        try {
            Local local = ingresoLocal.getLocal();
            local.setLoEstado(EstadoEnum.ACTIVO.getCodigo());
            local.setLoMostrarFotos(MostrarFotosEnum.TODAS.getCodigo());
            local.setLoMostrarPrecio("SI");
            this.create(local);
            localesImagenFacade.creaImagenesLocal(local);
            Usuario usuario = usuarioFacade.creaYActivaUsuario(ingresoLocal);
            sucursalFacade.creaYActivaSucursal(local, usuario);
        } catch (ActivarUsuarioException e) {
            LOG.error(" Error al crear y activar usuario al registrar local " + e);
            throw new RegistroLocalException(" Error al registrar local ");
        }catch(CreacionSucursalException e){
            LOG.error(" Error al crear sucursal al registrar local " + e);
            throw new RegistroLocalException(" Error al registrar local ");
        }catch(CrearLocalesImagenException e){
            LOG.error(" Error al crear imagenes del local " + e);
            throw new RegistroLocalException(" Error al registrar local ");
        }
    }

    /**
     * actualiza informacion del local
     *
     * @param local
     * @return
     * @throws AdministracionLocalException
     */
    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public Local actualizarLocal(Local local) throws AdministracionLocalException {
        try {
            this.edit(local);
            return local;
        } catch (Exception e) {
            LOG.error(" Eror al actualizar local " + e);
            throw new AdministracionLocalException(" Error al actualizar local");
        }

    }
    public Local recuperarPorCodigo(Integer codigo) {
        Query q = em.createNamedQuery("Local.findByLoCodigo");
        q.setParameter("loCodigo", codigo);
        return (Local) q.getSingleResult();
    }
}
